home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Languguage OS 2
/
Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO
/
language
/
embedded
/
m68k
/
68343ffp.arc
/
FFPFPBCD.SA
< prev
next >
Wrap
Text File
|
1989-08-30
|
9KB
|
195 lines
TTL FAST FLOATING POINT FLOAT TO BCD (FFPFPBCD)
***************************************
* (C) COPYRIGHT 1980 BY MOTOROLA INC. *
***************************************
*******************************************************
* FFPFPBCD *
* FLOAT TO BCD *
* *
* INPUT: D7 - FLOATING POINT NUMBER *
* *
* OUTPUT: SP - DECREMENTED BY 8 AND *
* POINTING TO THE CONVERTED *
* NUMBER IN BCD FORMAT AS DESCRIBED *
* BELOW - *
* *
* MMMM S E S B *
* *
* WHERE M - FOUR BYTES OF BCD, EACH WITH TWO *
* DIGITS OF THE MANTISSA (8 DIGITS) *
* S - SIGN OF MANTISSA ($00 +, $FF -) *
* E - BCD BYTE FOR TWO DIGIT EXPONENT *
* S - SIGN OF EXPONENT ($00 +, $FF -) *
* B - ONE BYTE BINARY 2'S COMPLEMENT *
* REPRESENTATION OF THE EXPONENT *
* *
* STACK OFFSET OF RESULT MMMMSESB *
* AFTER RETURN 00000000 *
* 01234567 *
* *
* M M M M S E S B *
* EXAMPLES $1200000000030003 +120 *
* $3141592700010001 3.14159 *
* $12000000FF030003 -120 *
* $10000000FF10000A -1,000,000,000 *
* $100000000002FFFE .001 (.1E-2) *
* M M M M S E S B *
* *
* CONDITION CODES: *
* N - SET IF THE RESULT IS NEGATIVE *
* Z - SET IF THE RESULT IS ZERO *
* V - CLEARED *
* C - CLEARED *
* X - UNDEFINED *
* *
* ALL REGISTERS ARE TRANSPARENT *
* *
* CODE SIZE: 168 BYTES STACK WORK: 72 BYTES *
* *
* NOTES: *
* 1) EVEN THOUGH EIGHT DIGITS ARE RETURNED, THE *
* PRECISION AVAILABLE IS ONLY 7.167 DIGITS. *
* ROUNDING SHOULD BE PERFORMED WHEN LESS *
* THAN THE FULL EIGHT DIGITS ARE ACTUALLY *
* USED IN THE MANTISSA. *
* 2) THE STACK IS LOWERED BY 8 BYTES BY THIS *
* ROUTINE. THE RETURN ADDRESS TO THE CALLER *
* IS REPLACED BY A PORTION OF THE RESULTS. *
* 3) THE BINARY BASE 10 EXPONENT IS RETURNED *
* TO FACILITATE CONVERSIONS TO OTHER FORMATS *
* *
* TIME: (8MHZ NO WAIT STATES ASSUMED) *
* APPROXIMATELY 330 MICROSECONDS CONVERTING *
* THE FLOAT VALUE 55.55 TO BCD. *
* *
*******************************************************
PAGE
FFPFPBCD IDNT 1,1 FFP FLOAT TO BCD
XDEF FFPFPBCD ENTRY POINT
XREF 9:FFP10TBL,FFPCPYRT POWER OF TEN TABLE
OPT PCS
SECTION 9
* STACK DEFINITION
STKOLD EQU 46 PREVIOUS CALLERS STACK POINTER
STKBEXP EQU 45 EXPONENT IN BINARY
STKEXPS EQU 44 EXPONENTS SIGN
STKEXP EQU 43 EXPONENT IN BCD
STKMANS EQU 42 MANTISSA'S SIGN
STKMANT EQU 38 MANTISSA IN BCD
STKNEWRT EQU 34 NEW RETURN POSITION
STKRTCC EQU 32 RETURN CONDITION CODE
STKSAVE EQU 0 REGISTER SAVE AREA
FFPFPBCD LEA -4(SP),SP SET STACK TO NEW LOCATION
MOVE.L 4(SP),-(SP) SAVE RETURN
TST.B D7 TEST VALUE
SUBA.W #2,A7 CLEAR SPOT FOR CCR
MOVEM.L D0,-(SP) PUSH D0 ON STACK
SF D0 CLR.B D0 W/O CHANGING CCR
BNE.S CCZ CHECK Z BIT,BRANCH IF CLR
BSET #6,D0 SET BIT 6 TO 1 FOR Z BIT
CCZ BCC.S CCC CHECK C BIT,BRANCH IF CLR
BSET #4,D0 SET BIT 4 TO 1 FOR C BIT
CCC BVC.S CCV CHECK V BIT,BRANCH IF CLR
BSET #5,D0 SET BIT 5 TO 1 FOR V BIT
CCV BPL.S CCN CHECK N BIT,BRANCH IF CLR
BSET #7,D0 SET BIT 7 TO 1 FOR N BIT
CCN ROXR.B #4,D0 ROTATE X BIT IN
AND.W #$1F,D0 CLEAR UPPER BYTE
MOVE.W D0,4(SP) SAVE CCR OF RESULT ON THE STACK
MOVE.L (SP)+,D0 RESTORE OLD D0 VALUE
MOVEM.L D2-D7/A0/A1,-(SP) SAVE WORK ADDRESS REGISTER
* ADJUST FOR ZERO VALUE
BNE.S FPFNOT0 BRANCH NO ZERO INPUT
MOVE.L #$41,D7 SETUP PSUEDO INTEGER EXPONENT
* SETUP MANTISSA'S SIGN
FPFNOT0 MOVE.B D7,D6 COPY SIGN+EXPONENT
SMI.B STKMANS(SP) SET RESULTS SIGN
* START SEARCH FOR MAGNITUDE IN BASE 10 POWER TABLE
ADD.B D6,D6 SIGN OUT OF PICTURE
MOVE.B #$80,D7 SET ROUDING FACTOR FOR SEARCH
EOR.B D7,D6 CONVERT EXPONENT TO BINARY
EXT.W D6 EXPONENT TO WORD
ASR.W #1,D6 BACK FROM SIGN EXTRACTMENT
MOVE.L #1,D3 START BASE TEN COMPUTATION
LEA FFP10TBL,A0 START AT TEN TO THE ZERO
CMP.W (A0),D6 COMPARE TO TABLE
BLT.S FPFMIN BRANCH MINUS EXPONENT
BGT.S FPFPLU BRANCH PLUS EXPONENT
FPFEQE CMP.L 2(A0),D7 EQUAL SO COMPARE MANTISSA'S
BCC.S FPFFND BRANCH IF INPUT GREATER OR EQUAL THAN TABLE
FPFBCK ADD.W #6,A0 TO NEXT LOWER ENTRY IN TABLE
SUB.W #1,D3 DECREMENT BASE 10 EXPONENT
BRA.S FPFFND BRANCH POWER OF TEN FOUND
* EXPONENT IS HIGHER THAN TABLE
FPFPLU LEA -6(A0),A0 TO NEXT HIGHER ENTRY
ADD.W #1,D3 INCREMENT POWER OF TEN
CMP.W (A0),D6 TEST NEW MAGNITUDE
BGT.S FPFPLU LOOP IF STILL GREATER
BEQ.S FPFEQE BRANCH EQUAL EXPONENT
BRA.S FPFBCK BACK TO LOWER AND FOUND
* EXPONENT IS LOWER THAN TABLE
FPFMIN LEA 6(A0),A0 TO NEXT LOWER ENTRY
SUB.W #1,D3 DECREMENT POWER OF TEN BY ONE
CMP.W (A0),D6 TEST NEW MAGNITUDE
BLT.S FPFMIN LOOP IF STILL LESS THAN
BEQ.S FPFEQE BRANCH EQUAL EXPONENT
* CONVERT THE EXPONENT TO BCD
FPFFND MOVE.B D3,STKBEXP(SP) FILL IN BINARY EXPONENT
SMI.B STKEXPS(SP) AND SET EXPONENTS SIGN
BPL.S FPFPEX BRANCH IF POSITIVE
NEG.W D3 ABSOLUTIZE
FPFPEX CLR.B D2 CREATE A ZEROTER
ADD.B D2,D2 CLEAR X BIT
ABCD.B D3,D2 CONVERT TO BCD
MOVE.B D2,STKEXP(SP) RETURN EXPONENT IN BCD
* GENERATE THE MANTISSA IN ASCII A0->TABLE D7=BINARY MANTISSA
* D5 - MANTISSA FROM TABLE D6.W = BINARY EXPONENT
* D4 - SHIFT AND DIGIT BUILDER D2 = DBRA MANTISSA DIGIT COUNT
* A1->MANTISSA STACK POSITION
MOVE.L #7,D2 COUNT FOR EIGHT DIGITS
MOVE.L #0,D3 ZERO BCD LONGWORD BUILD VALUE
TST.L D7 ? ZERO TO CONVERT
BPL.S FPFZRO BRANCH IF SO TO NOT ROUND
TST.B 5(A0) ? 24 BIT PRECISE IN TABLE
BNE.S FPFNXI BRANCH IF NO TRAILING ZEROES
FPFZRO CLR.B D7 CLEAR ADJUSTMENT FOR .5 LSB PRECISION
FPFNXI ASL.L #4,D3 SHIFT FOR NEXT DIGIT GENERATION
MOVE.W D6,D4 COPY BINARY EXPONENT
SUB.W (A0)+,D4 FIND NORMALIZATION FACTOR
MOVE.L (A0)+,D5 LOAD MANTISSA FROM TABLE
LSR.L D4,D5 ADJUST TO SAME EXPONENT
MOVE.L #9,D4 START AT NINE AND COUNT DOWN
FPFINC SUB.L D5,D7 SUBTRACT FOR ANOTHER COUNT
DBCS D4,FPFINC DECREMENT AND BRANCH IF OVER
BCS.S FPFNIR BRANCH PROPER EXECUTION
CLR.B D4 CORRECT RARE ERROR DUE TO TABLE IMPRECISION
FPFNIR ADD.L D5,D7 MAKE UP FOR OVER SUBTRACTION
SUB.B #9,D4 CORRECT VALUE
NEG.B D4 TO BETWEEN 0 AND 9 BINARY
OR.B D4,D3 INSERT AS NEXT DIGIT
DBRA D2,FPFNXI BRANCH IF MORE DIGITS TO GO
MOVE.L D3,STKMANT(SP) STORE MANTISSA BCD RESULT
* RETURN
MOVEM.L (SP)+,D2-D7/A0/A1 RESTORE WORK REGISTERS
RTR RETURN WITH PROPER CONDITION CODE
END